package com.YK.retryer.strategy.annotationwrapper.intervalwrapper.impl;

import com.YK.retryer.strategy.annotationwrapper.intervalwrapper.AbstractTimeIntervalWrapper;

/**
 * @author yuank
 * @version 1.0.0
 * @date 2025/2/28 15:43:22
 *
 * 假设：
 * 初始等待时间为 2秒
 * 最大重试次数为 3次
 * 时间单位为 秒
 *
 * 执行过程：
 * 第一次重试，等待 2秒 * 2^(0) = 2秒
 * 第二次重试，等待 2秒 * 2^(1) = 4秒
 * 第三次重试，等待 2秒 * 2^(2) = 8秒
 *
 *
 */
public class ExponentialBackoffRetry extends AbstractTimeIntervalWrapper {

    int attemptCount = 0;

    @Override
    public boolean retrySleepSuccess() {
        while (attemptCount < maxAttempts) {
            try {
                // 计算指数退避时间：时间 = 基本时间 * 2 ^ (当前重试次数 - 1)
                long waitTime = (long) (time * Math.pow(2, attemptCount));
                timeUnit.sleep(waitTime);
                attemptCount++;  // 递增重试次数
                return true;  // 重试成功
            } catch (InterruptedException e) {
                // 在等待期间被中断，抛出异常
                Thread.currentThread().interrupt();
                throw new RuntimeException("Retry interrupted", e);
            }
        }
        return false;  // 达到最大重试次数，返回失败
    }
}